using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using AutoBurnerLibrary;
using System.Security;
using System.Security.Permissions;

namespace AutoBurner
{
    class Program
    {
        public class Watcher
        {

            public static void Main()
            {
                Run();

            }

            [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
            public static void Run()
            {
                #region CommandLine Args
                string[] args = System.Environment.GetCommandLineArgs();

                // If a directory is not specified, exit program.
                if (args.Length != 2)
                {
                    // Display the proper way to call the program.
                    Console.WriteLine("Usage: Watcher.exe (directory)");
                    return;
                } 
                #endregion

                string filterType = "*.mp3";
                string watcherPath = args[1];
                string watcherPath2 = @"D:\My Music\Various Artists\I Want My 80's Box Disc 1";

                InitializeBurnList(filterType, watcherPath);
                InitializeBurnList(filterType, watcherPath2);

                BurnList burnList = BurnList.Instance;
                
                FileSystemWatcher watcher = CreateWatcher(filterType, watcherPath);                

                // Wait for the user to quit the program.
                Console.WriteLine("Press \'q\' to quit the sample.");
                while (Console.Read() != 'q') ;
            }

            private static void InitializeBurnList(string filterType, string watcherPath)
            {
                //First step in the program is to get an initial list of burn items
                string[] files = Directory.GetFiles(watcherPath, filterType);
                foreach (string file in files)
                {
                    BurnItem burnItem = BurnItem.CreateBurnItem(new FileInfo(file));
                    BurnList.AddItemToBurnList(burnItem);
                }
            }

            private static FileSystemWatcher CreateWatcher(string filterType, string watcherPath)
            {
                // Create a new FileSystemWatcher and set its properties.
                FileSystemWatcher watcher = new FileSystemWatcher();
                watcher.Path = watcherPath;
                /* Watch for changes in LastAccess and LastWrite times, and 
                   the renaming of files or directories. */
                watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                   | NotifyFilters.FileName | NotifyFilters.DirectoryName;
                // Only watch text files.
                watcher.Filter = filterType;


                // Add event handlers.
                watcher.Changed += new FileSystemEventHandler(OnChanged);
                watcher.Created += new FileSystemEventHandler(OnChanged);
                watcher.Deleted += new FileSystemEventHandler(OnChanged);
                watcher.Renamed += new RenamedEventHandler(OnRenamed);

                // Begin watching.
                watcher.EnableRaisingEvents = true;

                return watcher;
            }

            // Define the event handlers.
            private static void OnChanged(object source, FileSystemEventArgs e)
            {
                // Specify what is done when a file is changed, created, or deleted.
                Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
                if (e.ChangeType == WatcherChangeTypes.Created)
                {                    
                    BurnList.AddItemToBurnList(BurnItem.CreateBurnItem(new FileInfo(e.FullPath)));               
                }
                else if (e.ChangeType == WatcherChangeTypes.Deleted)
                {
                    BurnList.RemoveItemFromList(BurnItem.CreateShellBurnItem(e.FullPath));
                }
                
            }

            private static void OnRenamed(object source, RenamedEventArgs e)
            {
                // Specify what is done when a file is renamed.
                Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);

                BurnItem oldItem = BurnItem.CreateShellBurnItem(e.OldFullPath);
                BurnItem newItem = BurnItem.CreateBurnItem(new FileInfo(e.FullPath));

                BurnList.ReplaceItemOnBurnList(oldItem, newItem);
            }
            
        }
    }
}
